CLCK 14: Бэкапы в ClickHouse

Описание:

Все мы понимаем, что бэкапы — это очень важная часть безопасности данных. И ClickHouse не исключение из правил, поэтому в данном задании мы рассмотрим вопрос о том как создавать бэкапы и восстанавливать данные если что-то пошло не так.

Для этих процедур в ClickHouse не потребуются никакие дополнительные инструменты, поскольку все операции проводятся напрямую с файлами.

Для начала стоит понимать, что на физическом уровне ClickHouse оперирует не таблицами, а партициями — частями таблиц. Поэтому процедура бэкапа состоит из следующих этапов:

Заморозка партиций

Первым нашим шагом будет заморозка нужных партиций. Но перед этим нужно выяснить, какие партиции следует заморозить. Для этого мы будем использовать системную таблицу system.parts, в ней содержатся все существующие партиции и информация о том, к какой БД и таблице они относятся и являются ли активными.

Этот запрос позволяет обратиться к системной таблице и выделить из нее активные партиции, которые относятся к выбранной БД.

SELECT partition, table, database FROM system.parts WHERE active AND database = 'mydatabase';

В результате мы получим список партиций, каждую из которых необходимо заморозить.

┌─partition─┬─table─────┬─database───┐
│ 153752    │ clients   │ mydatabase │
...

Заморозка делается следующей командой:

ALTER TABLE mydatabase.clients FREEZE PARTITION '153752';

Копирование данных

После первой замороженной партиции ClickHouse создает в директории /var/lib/clickhouse/shadow/N/ бэкапы с такой же структурой, как в основной папке с данными. N — это инкрементальный номер бэкапа, поэтому, если это ваш первый бэкап, он будет равен 1. Такие бэкапы создаются очень быстро даже для больших таблиц, так как для этого используются жесткие ссылки.

Вот и все, после того, как мы заморозили все необходимые партиции, данные доступны для копирования в выбранную директории либо на внешний сервер.

Также есть смысл копировать не только сами данные, но и захватить метаданные, которые хранятся в /var/lib/clickhouse/metadata/mydatabase. В этой директории будут храниться SQL-файлы с определением структуры таблиц. В нашем случае это будет выглядеть вот так: /var/lib/clickhouse/metadata/mydatabase/clients.sql.

Восстановление данных

Эта процедура не слишком сложная и во многом является почти зеркальной созданию бэкапов.

Для начала нужно создать новую БД:

CREATE DATABASE newdatabase;

После нам нужно создать в ней таблицы, которые у нас были. Сделать это можно используя SQL запросы из нашего файла с метаданными, которые мы скопировали ранее, а именно clients.sql:

cat /path/to/backups/clients.sql | clickhouse-client --database newdatabase

После того, как таблицы были созданы, необходимо скопировать данные в директорию ClickHouse в папку detached.

cp -r /path/to/backups/clients /var/lib/clickhouse/data/newdatabase/clients/detached/

Убедимся, что у ClickHouse есть все права на данные:

chown clickhouse:clickhouse -R /var/lib/clickhouse/data/newdatabase/clients/

И последний шаг — это сделать ATTACH для всех партиций таблиц.

ALTER TABLE newdatabase.clients ATTACH PARTITION '153752';

Теперь данные должны быть на своем месте, а новая БД и таблицы в ней — готовы к использованию.

Полезные ссылки:

Задание. Правила:

  1. После нажатия кнопки «Начать выполнение» для вас будет подготовлено окружение и предоставлены необходимые доступы.
  2. Также вам будут выданы переменные (если они будут нужны), которые в задании указаны в фигурных скобках, — их надо будет подставить при выполнении задания.
  3. После выполнения всех пунктов задания нажмите кнопку «Отправить на проверку», и в течение ближайших 3-5 минут скрипт проверит выполнение всех условий и выставит вам оценку.
  4. В случае, если вы что-то забыли, можно исправить ошибки и отправить на проверку повторно.
  5. Также, если вы успешно сдали задание, но у вас остались вопросы — вы всегда сможете задать их куратору после проверки или в чате в любое удобное для вас время.

Задание:

  1. Создайте базу данных db
  2. Создайте локальную таблицу local_data с engine MergeTree со структурой, описанной ниже.
  3. Добавьте исторические данные (за предыдущие дни) - 10 строк за '2020-10-10'.
  4. Заморозьте все партиции для этой базы данных.
  5. Скопируйте получившиеся партици в /opt/ch/backups
  6. Создайте новую базу данных db_restore.
  7. Создайте заново все необходимые таблицы, используя файл с метаданными.
  8. Переместите все данные из бэкапов в новую БД.

Структура таблицы:

 id Int64,
 title String,
 description String,
 content String,
 date Date